/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.epsi.blokus.state;

import de.matthiasmann.twl.Button;
import de.matthiasmann.twl.EditField;
import de.matthiasmann.twl.Event;
import de.matthiasmann.twl.ScrollPane;
import de.matthiasmann.twl.TextArea;
import de.matthiasmann.twl.textarea.HTMLTextAreaModel;
import org.epsi.blokus.Hex;
import org.epsi.blokus.TWL_Slick_Binding.BasicTWLGameState;
import org.epsi.blokus.entity.*;
import org.epsi.blokus.tools.CaseUtil;
import org.epsi.blokus.tools.I18n;
import org.epsi.blokus.tools.IConstantes;
import org.epsi.blokus.tools.Log;
import org.epsi.blokus.tools.Point;
import org.epsi.blokus.widget.EditFieldEnhance;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.StateBasedGame;

/**
 *
 * @author julien.lafont
 */
public class JeuState extends BasicTWLGameState implements IConstantes  {

    private GameContainer container;
    private StateBasedGame game;

    private Board plateau = new Board();;
    private PlayerBox joueur_box_moi;
    private PlayerBox joueur_box_invite;

    
    @Override
    public int getID() {
       return ID_STATE_JEU;
    }


    public void init(GameContainer container, StateBasedGame game) throws SlickException {

        Log.out("JeuState : init");
        
        this.container = container;
        this.game = game;

    }

    @Override
    public void enter(GameContainer container, StateBasedGame game) throws SlickException {
        super.enter(container, game);


        // Crée les instances des entitées liées au jeu
        joueur_box_moi = new PlayerBox(Hex.getInstance().getPlayer(), 36, 371);
        joueur_box_invite = new PlayerBox(Hex.getInstance().getOpponent(), 836, 29);

        // Informe les joueurs du plateau de jeu
        Hex.getInstance().getPlayer().setBoard(plateau);
        Hex.getInstance().getOpponent().setBoard(plateau);

        // Informe l'adversaire du composant allant afficher ses chats
        Hex.getInstance().getOpponent().setChatState(this);

        // Initialise les instances
        plateau.init(container, game);
        joueur_box_invite.init(container, game);
        joueur_box_moi.init(container, game);
        
    }

   


    

    public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException {
        plateau.render(container, game, g);

        joueur_box_moi.render(container, game, g);
        joueur_box_invite.render(container, game, g);

    }

    public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException {
        plateau.update(container, game, delta);

        joueur_box_invite.update(container, game, delta);
        joueur_box_moi.update(container, game, delta);


    }





    // ----------------------------- Evènements ------------------------
  

    @Override
    public void mouseMoved(int oldx, int oldy, int newx, int newy) {
        super.mouseMoved(oldx, oldy, newx, newy);
        plateau.mouseMoved(oldx, oldy, newx, newy);
    }


    @Override
    public void mousePressed(int button, int x, int y) {
        super.mousePressed(button, x, y);

        // Je suis entrain de joué
        if (Hex.getInstance().getPlayer().isPlaying())
        {
            try {
                Point pt = CaseUtil.coordToCase(x, y);

                Log.out("Click dans la case "+pt.getX()+"/"+pt.getY());
                if (plateau.isFree(pt.getX(), pt.getY()))
                {
                    plateau.addPiece(pt.getX(), pt.getY(),Hex.getInstance().getPlayer().getCouleur() );
                    this.mouseMoved(x, y, x, y); // Pour forcer le refresh
                    
                    Hex.getInstance().getPlayer().jouer(pt.getX(), pt.getY());
                }
                
            } catch (SlickException ex) {

            }
        }
        
        // A gagné ou perdu
        else if (!Hex.getInstance().getPlayer().isWaiting())
        {
            //container.exit();
        }


    }

    /**
     * Réception d'un message CHAT
     * @param o
     * @param mess
     
    public void update(Observable o, Object mess) {
        Message m = (Message)mess;

        if(m.getTypeMessage()==Message.TTypeMessage.chat_salon_recevoir)
        {
            this.appendRowChat("chat"+Hex.getInstance().getPlayer().getCouleur().toString(), (String)m.getObject("MESSAGE"));
        }
    }*/



  // ---------------------------------- PARTIE GUI -------------------------------- //


    private  StringBuilder sb;
    public  HTMLTextAreaModel textAreaModel;
    public  TextArea textArea;
    private  EditFieldEnhance editField;
    private  ScrollPane scrollPane;
    private  Button btnQuitter;

    @Override
    protected void createRootPane() {
        super.createRootPane();
        rootPane.setTheme("jeustate");

        this.sb = new StringBuilder();
        this.textAreaModel = new HTMLTextAreaModel();
        this.textArea = new TextArea(textAreaModel);
        this.editField = new EditFieldEnhance();
        this.editField.setDefaultText("Saisissez votre message ici !");
        this.editField.setTheme("editfield");

        this.scrollPane = new ScrollPane(this.textArea);
        this.scrollPane.setFixed(ScrollPane.Fixed.HORIZONTAL);

        this.rootPane.add(this.scrollPane);
        this.rootPane.add(this.editField);

        /** Envoyer chat **/
        editField.addCallback(new EditField.Callback() {
            public void callback(int key) {
                if(key == Event.KEY_RETURN) {
                    appendRowChat("chat"+Hex.getInstance().getPlayer().getCouleur().toString(), editField.getText());
                    Hex.getInstance().getPlayer().envoyerChat(editField.getText());
                    editField.setText("");
                }
            }
        });

        btnQuitter = new Button(I18n.get("Quitter"));
        btnQuitter.addCallback(callBackBtnQuitter);
        rootPane.add(btnQuitter);

    }

   @Override
    protected void layoutRootPane() {
        super.layoutRootPane();
        rootPane.adjustSize();

        this.scrollPane.setSize(995, 95);
        this.scrollPane.setPosition(10, 635);

        this.editField.setSize(500, 30);
        this.editField.setPosition(0, 733);

        btnQuitter.adjustSize();
        btnQuitter.setPosition(840, 710);
    }

   /**
    * Ajoute une ligne au chat
    * @param font
    * @param text
    */
   public void appendRowChat(String font, String text) {
        sb.append("<div style=\"word-wrap: break-word; font-family: ").append(font).append("; \">").append(text).append("</div>");

        // Déplacer l'ascenseur pour toujours afficher les dernières lignes
        boolean isAtEnd = scrollPane.getMaxScrollPosY() == scrollPane.getScrollPositionY();
        textAreaModel.setHtml(sb.toString());

        if(isAtEnd) {
            scrollPane.validateLayout();
            scrollPane.setScrollPositionY(scrollPane.getMaxScrollPosY());
        }
    }

   
   // ---------------------------------- Callbacks  -------------------------------- //

   Runnable callBackBtnQuitter = new Runnable() {
        public void run() {
            System.exit(0);
        }
    };



}
